From: popcornmix Date: Tue, 2 May 2017 15:36:05 +0000 (+0100) Subject: vcsm: Treat EBUSY as success rather than SIGBUS X-Git-Tag: archive/raspbian/4.9.82-1+deb9u3+rpi1_jessie~5^2~241 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=ff7721467a7c8a1fd1b1790e66e8bafd907bdc30;p=linux-4.9.git vcsm: Treat EBUSY as success rather than SIGBUS Currently if two cores access the same page concurrently one will return VM_FAULT_NOPAGE and the other VM_FAULT_SIGBUS crashing the user code. Also report when mapping fails. Signed-off-by: popcornmix --- diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c index 1db6716c2c0c..ee4e05948c43 100644 --- a/drivers/char/broadcom/vc_sm/vmcs_sm.c +++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c @@ -1181,11 +1181,20 @@ static int vcsm_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) switch (ret) { case 0: case -ERESTARTSYS: + /* + * EBUSY is ok: this just means that another thread + * already did the job. + */ + case -EBUSY: return VM_FAULT_NOPAGE; case -ENOMEM: case -EAGAIN: + pr_err("[%s]: failed to map page pfn:%lx virt:%lx ret:%d\n", __func__, + pfn, (unsigned long)vmf->virtual_address, ret); return VM_FAULT_OOM; default: + pr_err("[%s]: failed to map page pfn:%lx virt:%lx ret:%d\n", __func__, + pfn, (unsigned long)vmf->virtual_address, ret); return VM_FAULT_SIGBUS; } }